<?php

/**

 * Classe model da tabela Sala

 * @filesource

 * @author			Diogo Corazolla

 * @copyright		Copyright 2009 M2R

 * @package			broffices

 * @subpackage		broffices.application.models

 * @version			1.0

*/

class Sala extends Zend_Db_Table_Abstract

{

	protected $_name = "tbl_sala";

	protected $_dependentTables = array("TipoSalaSala",

										"AgendaSala");

	protected $_referenceMap = array(

		'Unidade' => array(

			'columns' => 'unidade_id',

			'refTableClass' => 'Unidade',

			'refColumns' => 'id'

		)

	);

	/**
	 * Retorna registros do banco de dados
	 * @param array $where - array com dados where no formato "nome_coluna_1"=>"valor_1","nome_coluna_2"=>"valor_2"
	 * @param array $order - array com orders no formado "coluna_1 desc","coluna_2"...
	 * @param int $tamanho - numero de registros que deve retornar
	 * @param int $inicio - offset
	 * @return Zend_Db_Table_Rowset_Abstract
	 */
	public function busca($where=array(), $order=array(), $tamanho=-1, $inicio=-1)
	{

		// criando objeto do tipo select
		$slct = $this->select();

		$slct->setIntegrityCheck(false);

		$slct->from(array("s"=>"tbl_sala"));

		$slct->joinInner(array("u"=>"tbr_unidade"),
										"s.unidade_id = u.id",
										array("unidade_nome"=>"u.vhr_nome",
												"unidade_id"=>"u.id"));

		$slct->joinInner(array("t"=>"tbr_tiposala"),
										"s.tiposala_id = t.id",
										array("tiposala_nome"=>"t.vhr_nome"));

		// adicionando clausulas where
		foreach ($where as $coluna=>$valor)
		{
			$slct->where($coluna." ?", $valor);
		}

		// adicionando linha order ao select
		$slct->order($order);

		// paginacao 
		if ($tamanho > -1)
		{
			$tmpInicio = 0;

			if ($inicio > -1) 
			{
				$tmpInicio = $inicio;
			}
			$slct->limit($tamanho, $tmpInicio);
		}

		// retornando os registros conforme objeto select
		return $this->fetchAll($slct);
	}

	public function buscaDisponivelTipoPeriodo($tipo, $dataInicio, $numeroDias, $horaInicio, $horaFim, $numeroHoras)
	{
		// criando objeto do tipo select
		$slct = $this->select();

		$slct->setIntegrityCheck(false);

		$slct->from(array("s"=>"tbl_sala")); 

		$slct->joinInner(array("u"=>"tbr_unidade"), 
										"s.unidade_id = u.id", 
										array("unidade_nome"=>"u.vhr_nome",
												"unidade_id"=>"u.id"));

		/*$slct->joinInner(array("ts"=>"tba_tiposala_sala"),
										"s.id = ts.sala_id",
										array("capacidade"=>"ts.int_capacidade"));*/

		$slct->joinInner(array("t"=>"tbr_tiposala"),
										"s.tiposala_id = t.id",
										array("tiposala_id"=>"t.id"));

		$slct->where("t.id=".$tipo);
		$slct->where("t.bln_ativo=1");
		$slct->where("u.bln_ativo=1");
		$slct->where("s.bln_ativo=1");

		$dteTemp = clone $dataInicio;

		for ($i=0; $i<$numeroDias; $i++)
		{
			$hraTemp = clone $horaInicio;
			$hraTempFim = clone $horaFim;
			//$hraTempFim->add($numeroHoras, Zend_Date::HOUR);

			//echo $dteTemp->get(Zend_Date::W3C)."<br>";
			//echo "INICIO ".$hraTemp->get(Zend_Date::TIMES)."<br>";
			//echo "FIM ".$hraTempFim->get(Zend_Date::TIMES)."<br>";
			
			//for ($j=0; $j<$numeroHoras; $j++)
			//{
				//if ($j==$numeroHoras-1) $hraTemp->add(-1, Zend_Date::SECOND);
				$hraTempFim->add(-1, Zend_Date::SECOND);
				
				//echo $hraTemp->get(Zend_Date::TIMES)."<br>";
				//echo $hraTempFim->get(Zend_Date::TIMES)."<br>";

				/*$slct->where("s.id not in (select sala_id 

							from tbl_agenda

							where dte_data='".$dteTemp->get(Zend_Date::W3C)."' and 
							
							('".$hraTemp->get(Zend_Date::TIMES)."' between dte_inicio and dte_fim) and 
							
							('".$hraTempFim->get(Zend_Date::TIMES)."' between dte_inicio and dte_fim))");*/

				$slct->where("s.id not in (select sala_id 

							from tbl_agenda

							where dte_data='".$dteTemp->get(Zend_Date::W3C)."' and 
							
							((dte_inicio between '".$hraTemp->get(Zend_Date::TIMES)."'and '".$hraTempFim->get(Zend_Date::TIMES)."') OR 
							
							(dte_fim between '".$hraTemp->get(Zend_Date::TIMES)."'and '".$hraTempFim->get(Zend_Date::TIMES)."')))");

				//$hraTemp->add(1, Zend_Date::HOUR);

			//}

			$dteTemp->add(1, Zend_Date::DAY);

		}

		$slct->order(array("u.vhr_nome", "s.vhr_nome"));

		// retornando os registros conforme objeto select
		//xd($slct->query());
		return $this->fetchAll($slct);

	}

	public function buscaOcupadaData($data, $where=array())

	{

		// criando objeto do tipo select

		$slct = $this->select();

		

		$slct->setIntegrityCheck(false);



		$slct->from(array("s"=>"tbl_sala"));

		$slct->joinInner(array("u"=>"tbr_unidade"), 

								"s.unidade_id = u.id", 

								array("unidade_nome"=>"u.vhr_nome",

								"unidade_id"=>"u.id"));

		$slct->joinInner(array("a"=>"tbl_agenda"),

								"s.id = a.sala_id",

								array("agenda_id"=>"a.id",

										"agenda_data"=>"a.dte_data",

										"agenda_inicio"=>"a.dte_inicio",

										"agenda_fim"=>"a.dte_fim"));

		$slct->joinInner(array("c"=>"tbl_contrato"),

								"a.contrato_id = c.id",

								array("contrato_id"=>"c.id"));

		/*$slct->joinInner(array("st"=>"tbr_statusagenda"),

								"a.statusagenda_id = st.id",

								array("status_id"=>"st.id",

										"status_nome"=>"st.vhr_nome"));*/

		$slct->joinInner(array("p"=>"tbl_pessoa"),

								"c.pessoa_id = p.id",

								array("pessoa_id"=>"p.id",

										"pessoa_nome"=>"p.vhr_nome"));

		/*$slct->joinInner(array("tss"=>"tba_tiposala_sala"),

								"s.id = tss.sala_id");*/

		$slct->joinInner(array("t"=>"tbr_tiposala"),

								"s.tiposala_id = t.id",

								array("tiposala_id"=>"t.id",

										"tiposala_nome"=>"t.vhr_nome"));

										

		$slct->where("u.bln_ativo=1");

		$slct->where("s.bln_ativo=1");

		/*$slct->where("st.bln_ativo=1");*/

		$slct->where("a.dte_data='".$data->get(Zend_Date::W3C)."'");

		

		foreach ($where as $coluna=>$valor)

		{

			$slct->where($coluna." ?", $valor);

		}

										

		$slct->order(array("a.dte_inicio", "u.vhr_nome", "s.vhr_nome"));

		

		// retornando os registros conforme objeto select

		return $this->fetchAll($slct);

	}

	public function buscaSalasClientes($cliente_id, $where=array())
	{
		// criando objeto do tipo select
		$slct = $this->select();

		$slct->setIntegrityCheck(false);

		$slct->from(array("s"=>"tbl_sala"));

		$slct->joinInner(array("u"=>"tbr_unidade"), 

								"s.unidade_id = u.id", 

								array("unidade_nome"=>"u.vhr_nome",

								"unidade_id"=>"u.id"));

		$slct->joinInner(array("a"=>"tbl_agenda"),

								"s.id = a.sala_id",

								array("agenda_id"=>"a.id",

										"agenda_data"=>"DATE_FORMAT(a.dte_data, '%d/%m/%Y')",

										"agenda_inicio"=>"a.dte_inicio",

										"agenda_fim"=>"a.dte_fim"));

		$slct->joinInner(array("c"=>"tbl_contrato"),

								"a.contrato_id = c.id",

								array("contrato_id"=>"c.id"));

		/*$slct->joinInner(array("st"=>"tbr_statusagenda"),

								"a.statusagenda_id = st.id",

								array("status_id"=>"st.id",

										"status_nome"=>"st.vhr_nome"));*/

		$slct->joinInner(array("p"=>"tbl_pessoa"),

								"c.pessoa_id = p.id",

								array("pessoa_id"=>"p.id",

										"pessoa_nome"=>"p.vhr_nome"));

		$slct->joinInner(array("t"=>"tbr_tiposala"),

								"s.tiposala_id = t.id",

								array("tiposala_id"=>"t.id",

										"tiposala_nome"=>"t.vhr_nome"));

										

		$slct->where("u.bln_ativo=1");

		$slct->where("s.bln_ativo=1");

		$slct->where("c.id='".$cliente_id."'");

		

		foreach ($where as $coluna=>$valor)
		{

			$slct->where($coluna." ?", $valor);

		}						

		$slct->order(array("a.dte_data", "a.dte_inicio", "u.vhr_nome", "s.vhr_nome"));

		
		// retornando os registros conforme objeto select
		return $this->fetchAll($slct);

	}

	public function buscaSalasClientesINouNotIN($cliente_id, $where=array(), $order=array(), $tamanho=-1, $inicio=-1)
	{
		// criando objeto do tipo select
		$slct = $this->select();

		$slct->setIntegrityCheck(false);

		$slct->from(array("s"=>"tbl_sala"));

		$slct->joinInner(array("u"=>"tbr_unidade"), 
								"s.unidade_id = u.id", 
								array("unidade_nome"=>"u.vhr_nome",
									  "unidade_id"=>"u.id"));

		$slct->joinInner(array("a"=>"tbl_agenda"),
								"s.id = a.sala_id",
								array("agenda_id"=>"a.id",
										"agenda_data"=>"DATE_FORMAT(a.dte_data, '%d/%m/%Y')",
										"agenda_inicio"=>"a.dte_inicio",
										"agenda_fim"=>"a.dte_fim"));

		$slct->joinInner(array("c"=>"tbl_contrato"),
								"a.contrato_id = c.id",
								array("contrato_id"=>"c.id"));

		/*$slct->joinInner(array("st"=>"tbr_statusagenda"),
								"a.statusagenda_id = st.id",
								array("status_id"=>"st.id",
								"status_nome"=>"st.vhr_nome"));*/

		$slct->joinInner(array("p"=>"tbl_pessoa"),
								"c.pessoa_id = p.id",
								array("pessoa_id"=>"p.id",
									  "pessoa_nome"=>"p.vhr_nome"));

		$slct->joinInner(array("t"=>"tbr_tiposala"),
								"s.tiposala_id = t.id",
								array("tiposala_id"=>"t.id",
							    	  "tiposala_nome"=>"t.vhr_nome"));

		$slct->where("u.bln_ativo=1");

		$slct->where("s.bln_ativo=1");

		$slct->where("c.id=".$cliente_id);

		foreach ($where as $coluna=>$valor)
		{
			$slct->where($coluna, $valor);
		}

		$slct->order(array("a.dte_data", "a.dte_inicio", "u.vhr_nome", "s.vhr_nome"));
		
		//x($slct);
		// retornando os registros conforme objeto select
		return $this->fetchAll($slct);
	}

	

	/**

	 * apaga um registro da tabela

	 * @param int $codigo - codigo do registro para apagar

	 * @return void

	 */

	public function apaga($codigo)

	{

		$row = $this->find($codigo)->current();

		$row->bln_ativo = 0;

		$row->save();

		//$where = $this->getAdapter()->quoteInto('id = ?', $codigo);

		//$this->delete($where);

	}

	

	/**

	 * retorna total de registros do banco

	 * @param array $where - array com dados where no formato "nome_coluna_1"=>"valor_1","nome_coluna_2"=>"valor_2"

	 * @return int

	 */

	public function pegaTotal($where=array())

	{

		$slct = $this->select();

		

		$slct->setIntegrityCheck(false);



		$slct->from(array("s"=>"tbl_sala"), 

							array("COUNT(s.id) as total")); 

		$slct->joinInner(array("u"=>"tbr_unidade"), 

										"s.unidade_id = u.id", 

										array());

		

		foreach ($where as $coluna=>$valor)

		{

			$slct->where($coluna." ?", $valor);

		}

		

		$rows = $this->fetchAll($slct);

		

		return $rows->current()->total;

	}

}

